home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 47 / Amiga Format AFCD47 (Issue 131, Xmas 1999).iso / -screenplay- / shareware / mre / connect-4.amos / connect-4.amosSourceCode < prev    next >
AMOS Source Code  |  1999-10-04  |  5KB  |  220 lines

  1. '******************************************* 
  2. '* Connect-4 ï¿½ Mr E Software 
  3. '******************************************* 
  4. Randomize Timer
  5.  
  6. Dim BOARD(71),Y(6),DD(3),BVAL(71),C$(2)
  7.  
  8. Global BOARD(),BVAL(),Y(),DD(),XMOVE,WIN
  9.  
  10. C$(1)="RED "
  11. C$(2)="YELLOW "
  12.  
  13. Say "."
  14.  
  15. Do 
  16.    SETUP
  17.    
  18.    PLYER=1
  19.    
  20.    Print At(0,0);"    A:amiga v human  B:human v amiga"
  21.    Print At(0,1);"    C:human v human  D:amiga v amiga"
  22.    
  23.    GAME=0
  24.    
  25.    Do 
  26.       Wait 1
  27.       Inc GAME
  28.       If Mouse Click and Mouse Zone and Y Screen(Y Mouse)<16 Then GAME=Y Screen(Y Mouse)/8*2+X Screen(X Mouse)/160 : Exit 
  29.       F=Instr("ABCDQ",Upper$(Inkey$)) : If F Then GAME=F-1 : Exit 
  30.       If GAME=1500 Then GAME=3 : Exit 
  31.    Loop 
  32.    
  33.    If GAME=4 Then End 
  34.    
  35.    Cls 0,0,0 To 320,16
  36.    
  37.    If GAME=3 Then Hide 
  38.    
  39.    LEVEL=1
  40.    
  41.    For F=0 To 41
  42.       
  43.       If(PLYER=1 and(GAME=0 or GAME=3)) or(PLYER=2 and(GAME=1 or GAME=3))
  44.          Hide 
  45.          EVALUATE[PLYER,LEVEL,LEVEL,0,6]
  46.          Show 
  47.          Exit If GAME=3 and Mouse Click
  48.       Else 
  49.          Repeat 
  50.             Do 
  51.                If Mouse Click and Mouse Zone : XMOVE=(X Screen(X Mouse)-48)/32 : Exit : End If 
  52.                XMOVE=Instr("1234567",Inkey$) : If XMOVE : Dec XMOVE : Exit : End If 
  53.             Loop 
  54.          Until Y(XMOVE)>8
  55.       End If 
  56.       
  57.       X=(Y(XMOVE) mod 9)*32+16 : Y=(Y(XMOVE)/9)*32
  58.       For YY=-32 To Y Step 8
  59.          Bob 1,X,YY,PLYER
  60.          Wait Vbl 
  61.       Next YY
  62.       Paste Bob X,Y,PLYER
  63.       
  64.       WIN=0
  65.       EVALUATE[PLYER,0,0,XMOVE,XMOVE]
  66.       Exit If WIN
  67.       
  68.       BOARD(Y(XMOVE))=PLYER
  69.       Add Y(XMOVE),-9
  70.       PLYER=(PLYER xor 3)
  71.    Next F
  72.    
  73.    Print At(0,0);
  74.    If WIN
  75.       If(PLYER=1 and GAME=0) or(PLYER=2 and GAME=1)
  76.          Centre "I WIN!" : Say "I WIN."
  77.       Else 
  78.          If GAME<2
  79.             Centre "YOU WIN!" : Say "YOU WIN."
  80.          Else 
  81.             Centre C$(PLYER)+"WINS!" : Say C$(PLYER)+"WINS."
  82.          End If 
  83.       End If 
  84.    Else 
  85.       Centre "IT'S A DRAW!" : Say "ITS A DRAW."
  86.    End If 
  87.    Print : Centre "Press a key..."
  88.    Bob Off 
  89.    Clear Key 
  90.    For F=1 To 500
  91.       Wait 1
  92.       Exit If(Inkey$<>"") or Mouse Key
  93.    Next F
  94.    
  95.    If GAME=3 Then Show 
  96.    
  97. Loop 
  98.  
  99. Procedure SETUP
  100.    Screen Open 0,320,256,16,Lowres
  101.    Flash Off : Curs Off : Paper 0 : Cls : Screen Hide 0
  102.    Get Sprite Palette 
  103.    
  104.    Reserve Zone 1
  105.    Set Zone 1,48,0 To 271,255
  106.    
  107.    Wait Vbl : Limit Mouse 
  108.    
  109.    Ink 7
  110.    For F=0 To 71
  111.       Read BOARD(F)
  112.       Paste Bob(F mod 9)*32+16,(F/9)*32,BOARD(F)
  113.    Next F
  114.  
  115.    Ink 10,0
  116.    For F=0 To 6 : Text 60+32*F,248,Chr$(F+49) : Next F
  117.    
  118.    Double Buffer : Screen Show 0
  119.    
  120.    For F=0 To 71 : Read BVAL(F) : Next F
  121.    
  122.    For F=1 To 7 : Y(F-1)=F : Next F
  123.    For F=0 To 6 : While BOARD(Y(F)+9)=3 : Add Y(F),9 : Wend : Next F
  124.    
  125.    For F=0 To 3 : Read DD(F) : Next F
  126.    
  127.    Set Bob 1,,7,
  128.    Set Bob 2,,7,
  129.    
  130.    Data 8,7,7,7,7,7,7,7,9
  131.    Data 4,3,3,3,3,3,3,3,5
  132.    Data 4,3,3,3,3,3,3,3,5
  133.    Data 4,3,3,3,3,3,3,3,5
  134.    Data 4,3,3,3,3,3,3,3,5
  135.    Data 4,3,3,3,3,3,3,3,5
  136.    Data 4,3,3,3,3,3,3,3,5
  137.    Data 11,6,6,6,6,6,6,6,10
  138.    
  139.    Data 0,0,0,0,0,0,0,0,0
  140.    Data 0,0,2,4,4,4,2,0,0
  141.    Data 0,0,2,4,4,4,2,0,0
  142.    Data 0,0,2,4,4,4,2,0,0
  143.    Data 0,0,2,4,4,4,2,0,0
  144.    Data 0,0,2,4,4,4,2,0,0
  145.    Data 0,0,2,4,7,4,2,0,0
  146.    Data 0,0,0,0,0,0,0,0,0
  147.    
  148.    Data -1,10,8,9
  149.    
  150. End Proc
  151.  
  152. Procedure EVALUATE[COUNTER,PLY,LEVEL,XSTART,XEND]
  153.    
  154.    TVAL=-999999
  155.    
  156.    For X=XSTART To XEND
  157.       
  158.       If Y(X)>8
  159.          
  160.          EVAL=-1
  161.          
  162.          For C=32 To 48 Step 16
  163.             
  164.             For D=0 To 3+(PLY<>LEVEL)
  165.                
  166.                E=C+BVAL(Y(X))+Rnd(4)
  167.                V=0
  168.                
  169.                P=Y(X)+DD(D)
  170.                While BOARD(P)=COUNTER
  171.                   Add P,DD(D)
  172.                   Add E,32
  173.                   Inc V
  174.                Wend 
  175.                While(BOARD(P)=COUNTER or BOARD(P)=3) and V<3
  176.                   Add P,DD(D)
  177.                   Inc V
  178.                Wend 
  179.                
  180.                P=Y(X)-DD(D)
  181.                While BOARD(P)=COUNTER
  182.                   Add P,-DD(D)
  183.                   Add E,32
  184.                   Inc V
  185.                Wend 
  186.                While(BOARD(P)=COUNTER or BOARD(P)=3) and V<3
  187.                   Add P,-DD(D)
  188.                   Inc V
  189.                Wend 
  190.                
  191.                E=E*-(V>2)
  192.                If E>127 : TVAL=10000+C : If C=32 : WIN=-1 : End If : MOVE=X : Exit 3 : End If 
  193.                If E>EVAL : EVAL=E : End If 
  194.                
  195.             Next D
  196.             
  197.             COUNTER=(COUNTER xor 3)
  198.             
  199.          Next C
  200.          
  201.          If PLY
  202.             BOARD(Y(X))=COUNTER : Add Y(X),-9
  203.             
  204.             EVALUATE[COUNTER,PLY-1,LEVEL,X,X]
  205.             Add EVAL,-Param
  206.             
  207.             Add Y(X),9 : BOARD(Y(X))=3
  208.          End If 
  209.          
  210.          If EVAL>TVAL : TVAL=EVAL : MOVE=X : End If 
  211.          
  212.          '         If PLY=LEVEL : Print At(X*4+6,29+(X and 1));EVAL;"    " : End If 
  213.          
  214.       End If 
  215.       
  216.    Next X
  217.    
  218.    If PLY=LEVEL Then XMOVE=MOVE
  219.    
  220. End Proc[TVAL]